#include"comm.hpp"
extern Log log;

int main()
{
   // sleep(3);
    int shmid = CreateShm(); 
    //log(Debug,"Create shm done");
    //关联
    //sleep(5);
    char* shmaddr = (char*)shmat(shmid,nullptr,0);
    //shmat 是 Linux 中的一个系统调用函数，用于将一个共享内存段附加到当前进程的地址空间。这样，进程就可以通过指针来访问共享内存段中的数据了。
    //void *shmat(int shmid, const void *shmaddr, int shmflg);返回值也为void*，非常像malloc。
    //shmid：共享内存标识符，通常是通过 shmget 函数获得的。
    //shmaddr：一个指针，表示附加共享内存段的首选地址。通常将此参数设置为 NULL，让系统自动选择一个合适的地址。
    //shmflg：一个整数，表示附加共享内存段的标志。常用标志包括 SHM_RDONLY（以只读方式附加共享内存段）和 0（以读写方式附加共享内存段）。
    //返回值：成功时，shmat 返回一个非空指针，表示共享内存段在当前进程地址空间的起始地址。失败时，返回 (void *)-1，并设置相应的 errno。
    //log(Debug,"attach shm done,shmaddr:0x%x",shmaddr);
    // ipc code 在这里
    while(true)
    {
        cout<<"client say@"<<shmaddr<<endl;//直接访问共享内存
    }
    //sleep(5);
    shmdt(shmaddr);//去关联
    // int shmdt(const void *shmaddr);
    // hmdt() 是一个Linux系统调用函数，用于将当前进程地址空间中附加的共享内存段分离。当进程不再需要访问共享内存段时，可以调用 shmdt() 函数将其分离。
    // 返回值：成功时，shmdt() 返回0。失败时，返回-1，并设置相应的 errno。

    //log(Debug,"detach shm done,shmaddr:0x%x",shmaddr);
    shmctl(shmid,IPC_RMID,nullptr);//shmctl 函数的全称是 "shared memory control"，它用于控制共享内存段
    //int shmctl(int shmid, int cmd, struct shmid_ds *buf);cmd是指定要执行的操作的命令参数，
    //IPC_RMID是IPC（Inter-Process Communication，进程间通信）中的一个命令，
    //用于从系统中删除一个已经存在的共享内存段。当调用shmctl函数并传递IPC_RMID命令时，
    //系统会删除与该共享内存标识符（shmid）关联的共享内存段。
    //buf是一个指向shmid_ds结构的指针，用于存储共享内存的属性信息。
    //log(Debug,"destory shm done,shmaddr:0x%x",shmaddr);
    //sleep(5);

    return 0;
}